﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Security.Cryptography;
using System.IO;
using Org.BouncyCastle.Crypto.Engines;
using Org.BouncyCastle.Crypto.Paddings;

namespace MHKBMTH
{
    public partial class Form1 : Form
    {
        
        public Form1()
        {
            InitializeComponent();
           
        }

        public static void RijndaelEncryption(string fileIn, string fileOut, string Password)
        {
            try
            {
                FileStream fsIn = new FileStream(fileIn,
                    FileMode.Open, FileAccess.Read);
                FileStream fsOut = new FileStream(fileOut,
                    FileMode.OpenOrCreate, FileAccess.Write);


                PasswordDeriveBytes pdb = new PasswordDeriveBytes(Password,
                    new byte[] {0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 
            0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76});
                System.Security.Cryptography.
                Rijndael alg = Rijndael.Create();
                alg.Key = pdb.GetBytes(32);
                alg.IV = pdb.GetBytes(16);


                CryptoStream cs = new CryptoStream(fsOut,
                    alg.CreateEncryptor(), CryptoStreamMode.Write);

                int bufferLen = 4096;
                byte[] buffer = new byte[bufferLen];
                int bytesRead;

                do
                {
                    bytesRead = fsIn.Read(buffer, 0, bufferLen);

                    cs.Write(buffer, 0, bytesRead);
                } while (bytesRead != 0);


                cs.Close();
                fsIn.Close();
            }
            catch
            {
                MessageBox.Show("Error! Mã Hóa");
            }
        }
        public static void RijndaelDecryption(string fileIn, string fileOut, string Password)
        {
            try
            {

                // Mở các dòng tập tin
                FileStream fsIn = new FileStream(fileIn,
                            FileMode.Open, FileAccess.Read);
                FileStream fsOut = new FileStream(fileOut,
                            FileMode.OpenOrCreate, FileAccess.Write);

                // Lấy khóa và IV từ Password 
                PasswordDeriveBytes pdb = new PasswordDeriveBytes(Password,
                    new byte[] {0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 
            0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76});
                Rijndael alg = Rijndael.Create();
                alg.Key = pdb.GetBytes(32);
                alg.IV = pdb.GetBytes(16);

                // Tạo ra dòng mật mã thông qua đó đưa dữ liệu vào
                // fileOut sẽ nhận các byte đã mã hóa. 
                CryptoStream cs = new CryptoStream(fsOut,
                    alg.CreateDecryptor(), CryptoStreamMode.Write);

                // Khởi tạo một bộ đệm và xử lý các tập tin đầu vào
                // để tránh đọc toàn bộ tập tin (có thể là rất lớn) vào bộ nhớ.
                int bufferLen = 4096;
                byte[] buffer = new byte[bufferLen];
                int bytesRead;

                do
                {
                    // Đọc đoạn dữ liệu từ tập tin đầu vào 
                    bytesRead = fsIn.Read(buffer, 0, bufferLen);

                    // Giải mã
                    cs.Write(buffer, 0, bytesRead);

                } while (bytesRead != 0);

                // Đóng tất cả
                cs.Close();
                fsIn.Close();
            }
            catch
            {
                MessageBox.Show("Error! Giải Mã");
            }
        }    
        //
        //
        public string TwoFishEncryption(string plain, string key)
        {
            BCEngine bcEngine = new BCEngine(new TwofishEngine(), Encoding.ASCII);
            bcEngine.SetPadding(new Pkcs7Padding());
            return bcEngine.Encrypt(plain, key);
        }
        public string BlowFishDecryption(string cipher, string key)
        {
            BCEngine bcEngine = new BCEngine(new TwofishEngine(), Encoding.ASCII);
            bcEngine.SetPadding(new Pkcs7Padding());
            return bcEngine.Decrypt(cipher, key);
        }

        private void btnMH_Click(object sender, EventArgs e)
        {
            OpenFileDialog dlgFile = new OpenFileDialog();
            dlgFile.Title = "Chọn file";
            dlgFile.Filter = "Tất cả (*.*)|*.*";
            dlgFile.FilterIndex = 0;
            if (dlgFile.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                txtMH.Text = dlgFile.FileName;
                //FileInfo MyFile = new FileInfo(txtMH.Text);
            }
        }

        private void btnDMH_Click(object sender, EventArgs e)
        {
            OpenFileDialog dlgFile = new OpenFileDialog();
            dlgFile.Title = "Chọn file";
            dlgFile.Filter = "Tất cả (*.*)|*.*";
            dlgFile.FilterIndex = 0;
            if (dlgFile.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                txtDMH.Text = dlgFile.FileName;
                //FileInfo MyFile = new FileInfo(txtDMH.Text);
            }
            
        }
        private void checkBoxPassw_CheckedChanged(object sender, EventArgs e)
        {
            if (checkBoxPassw.Checked == false)
                txtPass.UseSystemPasswordChar = true;
            else txtPass.UseSystemPasswordChar = false;

        }
        //
        //
        private void btnMaHoa_Click(object sender, EventArgs e)
        {
            //if (txtMH == null || txtMH.Text.Length <= 0)
            //    throw new ArgumentNullException("Plaintext");
            //if (txtPass == null || txtPass.Text.Length <= 0)
            //    throw new ArgumentNullException("Key");
            //if (txtIV == null || txtIV.Text.Length <= 0)
            //    throw new ArgumentNullException("Key");
            switch (comboBoxTT.Text)
            {
                case "RijnDael":
                    RijndaelEncryption(txtMH.Text, txtDMH.Text, txtPass.Text);
                    break;
            }


        }

        private void btnGiaiMa_Click(object sender, EventArgs e)
        {
            switch (comboBoxTT.Text)
            {
                case "RijnDael":
                    RijndaelDecryption(txtMH.Text, txtDMH.Text, txtPass.Text);
                    break;
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
        

   
    }
}
